package com.crab.c01array;


/**
 * @author zfd
 * @version v1.0
 * @date 2022/4/28 16:51
 */
public class MyArray {
    /**
     * 模拟一个数组
     */
    private int[] array;
    private int size;

    public MyArray(int capacity) {
        this.array = new int[capacity];
        // 实际元素个数
        this.size = 0;

    }

    /**
     * 插入元素
     * 尾部插入index==size
     * 头部或中间插入index < size && index > 0
     *
     * @param index   位置索引
     * @param element 元素
     */
    public void insert(int index, int element) {
        // 数组下标越界
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("超出数组的实际范围");
        }

        // 如果实际元素数量到了容量上限 2倍扩容
        if (size >= array.length) {
            resize();
        }

        // 从右到左，元素逐个向右挪1位简单
        for (int i = size - 1; i >= index; i--) {
            array[i + 1] = array[i];
        }

        // 挪出的位置插入模板元素
        array[index] = element;

        // 当前的元素数+1
        size++;
    }

    private void resize() {
        System.out.println("数组扩容从 " + array.length + " 到 " + array.length * 2);
        int[] arrayNew = new int[array.length * 2];
        // 旧数组数据复制到新数组
        System.arraycopy(array, 0, arrayNew, 0, array.length);
        array = arrayNew;
    }

    public void output() {
        for (int i = 0; i < size; i++) {
            System.out.print(array[i]);
            System.out.print(' ');
        }
    }

    /**
     * 删除指定位置的元素，其右边元素逐步左移
     */
    public int delete(int index) {
        // 数组下标越界
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("超出数组的实际范围");
        }
        int element = array[index];

        //  从左到右，元素逐个向左挪1位
        for (int i = index; i < size - 1; i++) {
            array[i] = array[i + 1];
        }
        size--;

        return element;
    }

    /**
     *
     */
    public static void main(String[] args) {
        MyArray myArray = new MyArray(10);
        myArray.insert(0, 0);
        myArray.insert(1, 1);
        myArray.insert(2, 2);
        myArray.insert(3, 3);
        myArray.insert(4, 4);
        myArray.insert(5, 5);
        myArray.insert(6, 6);
        myArray.insert(7, 7);
        myArray.insert(8, 8);
        myArray.insert(9, 9);
        myArray.insert(10, 10);
        //  删除
        System.out.println(myArray.delete(3));
        myArray.output();
    }


}
